
import logging
import time
import os

from Common.Path_Constant import get_log_path

STREAM = True


class LogUtil:

    def __init__(self):
        # 配置logger的地址

        # logging模块包括logger，handler，filter，formatter这四个基本概念。
        # logging模块与log4j的机制是一样的，只是具体的实现细节不同。模块提供logger，handler，filter，formatter。
        # logger：提供日志接口，供应用代码使用。logger最长用的操作有两类：配置和发送日志消息。可以通过logging.getLogger(name)
        # 获取logger对象，如果不指定name则返回root对象，多次使用相同的name调用getLogger方法返回同一个logger对象。
        # handler：将日志记录(logrecord)发送到合适的目的地(destination)，比如文件，socket等。一个logger对象可以通过addHandler方法添加0到多个handler，每个handler又可以定义不同日志级别，以实现日志分级过滤显示。
        # filter：提供一种优雅的方式决定一个日志记录是否发送到handler。
        # formatter：指定日志记录输出的具体格式。formatter的构造方法需要两个参数：消息的格式字符串和日期字符串，这两个参数都是可选的。

        # loggers
        # 就是程序可以直接调用的一个日志接口，可以直接向logger写入日志信息。logger并不是直接实例化使用的，而是通过logging.getLogger(name)
        # 来获取对象，事实上logger对象是单例模式，logging是多线程安全的，也就是无论程序中哪里需要打日志获取到的logger对象都是同一个。
        self.logger = logging.getLogger("logger")

        # 设置日志的输出级别 为： DEBUG()
        self.logger.setLevel(logging.DEBUG)

        # 避免日志重复
        if not self.logger.handlers:
            # 定义日志名称
            self.log_name = '{}.log'.format(time.strftime("%Y_%m_%d", time.localtime()))

            # 定义日志路径及文件名称
            self.log_path_file = os.path.join(get_log_path(), self.log_name)

            # 定义文件处理handler
            fh = logging.FileHandler(self.log_path_file, encoding='utf-8', mode='w')

            # 设置文件处理handler的日志级别
            fh.setLevel(logging.DEBUG)

            # 日志格式变量
            formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")

            # 设置打印格式
            fh.setFormatter(formatter)

            # 添加handler
            self.logger.addHandler(fh)

            # 关闭handler
            fh.close()

            # 控制台输出
            if STREAM:
                # 定义控制台输出流Handler
                fh_stream = logging.StreamHandler()

                # 控制台输出日志级别
                fh_stream.setLevel(logging.DEBUG)

                # 设置打印格式
                fh_stream.setFormatter(formatter)

                # 添加handler
                self.logger.addHandler(fh_stream)


      # 其他程序可直接调用logger对象
    def log(self):
      # 返回定义好的logger对象，对外直接使用log函数即可
      return self.logger

logger = LogUtil().log()





